<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>js 中的call() 和 apply()</title>
	</head>
	<body>
		<script type="text/javascript">
			"use strict"
			/* ECMAScript规范为所有函数都包含两个方法(这两个方法非继承而来)。
			 call()和apply()
			 这两个函数都是在特定的作用域中调用函数,能改变函数的作用域，实际上是----改变函数体内 this 指向的对象 。*/
			 
			/* call(thisObj，Object)
			 调用一个对象的一个方法，以另一个对象替换当前对象。
			 call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象.如果没有提供 thisObj 参数，那么 Global 对象被用作 thisObj*/
		
			/* apply(thisObj，[argArray])
			 应用某一对象的一个方法，用另一个对象替换当前对象。
			 如果 argArray 不是一个有效的数组或者不是 arguments 对象，那么将导致一个 TypeError。如果没有提供 argArray 和 thisObj 任何一个参数，那么 Global 对象将被用作 thisObj， 并且无法被传递任何参数*/
		
			var add = function(x,y){
				return x+y;
			}
			var myAddCall = function(x,y){
				return add.call(this,x,y);
			}
			var result = myAddCall(1,22);
			console.log(result);
			
			
// 			var name = '小白';
// 			var obj = {name:'小红'};
// 			function sayName() {
// 				console.log(this === window)
// 				return this.name;
// 			}
// 			console.log(sayName())				//输出 true 小白 //由此也能看出在全部下设置的全局变量实际为对象 window 下添加的属性
// 			console.log(sayName.call(this));    //输出 true 小白 //由此也能看出在全部下设置的全局变量实际为对象 window 下添加的属性
// 			console.log(sayName. call(obj));    //输入 false 小红
			
			
			var Animal = function(kind){
				this.kind = kind;
				this.sound = "嘎嘎";
				this.getSound = function(){
					console.log(this.sound);
				}
			}
			/* Animal.prototype.getSound = function(){
				console.log(this.sound);
			} */
			var animal = new Animal("duck","嘎嘎");
			
			
			var Duck = function(number){
				Animal.call(this);
				this.number = number;
			}
			var ducks = new Duck(12);
			ducks.getSound();
			
		</script>
	</body>
</html>
